#ifndef DATABASEMANAGER_H
#define DATABASEMANAGER_H

#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVector>
#include <QVariantMap>

class DatabaseManager : public QObject
{
    Q_OBJECT

public:
    // 单例模式访问
    static DatabaseManager* instance();

    // 初始化数据库连接
    bool initialize(const QString& dbName = "car.db");

    // 基础操作
    bool execute(const QString& sql, const QVariantMap& params = QVariantMap());
    QVector<QVariantMap> query(const QString& sql, const QVariantMap& params = QVariantMap());

    // 停车场相关操作
    bool addCar(const QString& carId, const QString& enterTime);
    bool removeCar(const QString& carId);
    bool addParkingRecord(const QString& carId, const QString& enterTime,
                         const QString& lastTime, int seconds, double money, bool isVip);

    // 查询操作
    bool isCarInParking(const QString& carId);
    int getCurrentCarCount();
    QVector<QVariantMap> getCurrentCars();
    QVector<QVariantMap> getHistoryRecords(bool vipOnly = false);

    // 车位管理
    bool updateParkingSlots(int totalSlots);
    QVector<QVariantMap> getParkingSlotsInfo();
    bool assignCarToSlot(const QString& carId, int slotNumber, const QString& enterTime);
    bool freeParkingSlot(int slotNumber);

    // 用户账户管理
    bool addUser(const QString& account, const QString& password);
    bool validateUser(const QString& account, const QString& password);

    QString lastError() const { return m_lastError; }

private:
    explicit DatabaseManager(QObject *parent = nullptr);
    ~DatabaseManager();

    static DatabaseManager* s_instance;

    QSqlDatabase m_db;
    QString m_dbName;

    // 创建表结构
    bool createTables();

    // 检查表是否存在
    bool tableExists(const QString& tableName);

    // 记录最后错误
    QString m_lastError;
};

#endif // DATABASEMANAGER_H
